home *** CD-ROM | disk | FTP | other *** search
/ Software of the Month Club 2000 October / Software of the Month - Ultimate Collection Shareware 277.iso / pc / PROGRAMS / UTILITY / WINLINUX / DATA1.CAB / programs_-_include / NET / SCM.H < prev    next >
C/C++ Source or Header  |  1999-09-17  |  2KB  |  68 lines

  1. #ifndef __LINUX_NET_SCM_H
  2. #define __LINUX_NET_SCM_H
  3.  
  4. /* Well, we should have at least one descriptor open
  5.  * to accept passed FDs 8)
  6.  */
  7. #define SCM_MAX_FD    (OPEN_MAX-1)
  8.  
  9. struct scm_fp_list
  10. {
  11.     int        count;
  12.     struct file    *fp[SCM_MAX_FD];
  13. };
  14.  
  15. struct scm_cookie
  16. {
  17.     struct ucred        creds;        /* Skb credentials    */
  18.     struct scm_fp_list    *fp;        /* Passed files        */
  19.     unsigned long        seq;        /* Connection seqno    */
  20. };
  21.  
  22. extern void scm_detach_fds(struct msghdr *msg, struct scm_cookie *scm);
  23. extern int __scm_send(struct socket *sock, struct msghdr *msg, struct scm_cookie *scm);
  24. extern void __scm_destroy(struct scm_cookie *scm);
  25. extern struct scm_fp_list * scm_fp_dup(struct scm_fp_list *fpl);
  26.  
  27. static __inline__ void scm_destroy(struct scm_cookie *scm)
  28. {
  29.     if (scm && scm->fp)
  30.         __scm_destroy(scm);
  31. }
  32.  
  33. static __inline__ int scm_send(struct socket *sock, struct msghdr *msg,
  34.                    struct scm_cookie *scm)
  35. {
  36.     memset(scm, 0, sizeof(*scm));
  37.     scm->creds.uid = current->uid;
  38.     scm->creds.gid = current->gid;
  39.     scm->creds.pid = current->pid;
  40.     if (msg->msg_controllen <= 0)
  41.         return 0;
  42.     return __scm_send(sock, msg, scm);
  43. }
  44.  
  45. static __inline__ void scm_recv(struct socket *sock, struct msghdr *msg,
  46.                 struct scm_cookie *scm, int flags)
  47. {
  48.     if (!msg->msg_control)
  49.     {
  50.         if (sock->passcred || scm->fp)
  51.             msg->msg_flags |= MSG_CTRUNC;
  52.         scm_destroy(scm);
  53.         return;
  54.     }
  55.  
  56.     if (sock->passcred)
  57.         put_cmsg(msg, SOL_SOCKET, SCM_CREDENTIALS, sizeof(scm->creds), &scm->creds);
  58.  
  59.     if (!scm->fp)
  60.         return;
  61.     
  62.     scm_detach_fds(msg, scm);
  63. }
  64.  
  65.  
  66. #endif __LINUX_NET_SCM_H
  67.  
  68.